package config

import (
	"os"
	"gopkg.in/yaml.v3"
)

type AppConfig struct {
	/**
		服务配置
		有没有  type  关键字决定“是否命名”；
		只要出现  struct { ... }  就是结构体，匿名结构体就是“当场写、当场用、没名字”的结构体
		Server Database Redis Jwt都是当场定义的匿名结构体

		Go 的 YAML 库（ gopkg.in/yaml.v3  /  yaml.v2 ）不会把同一个标签“继承”给后续字段；
	省略标签的字段会按默认规则（结构体字段名小写）去匹配，一旦 YAML 里是下划线或短横线就会落空
	*/
	Server struct {
		Host string
		Port int
	}
	/**
	数据库
	*/
	Database struct {
		Mysql struct {
			Url         string
			MaxIdleConn int `yaml:"max_idle_conn"`
			MaxOpenConn int `yaml:"max_open_conn"`
			MaxIdleTime int `yaml:"max_idle_time"`
		}
	}
	/**
	redis 配置
	*/
	Redis struct {
		Host         string
		Port         int
		Auth         string
		ReadTimeOut  int `yaml:"read_timeout"`
		WriteTimeOut int `yaml:"write_timeout"`
		MinIdleConn  int `yaml:"min_idle_conn"`
	}
	//wt
	Jwt struct {
		SecretKey  string `yaml:"secret_key"`  //秘钥
		ExpireHour int    `yaml:"expire_hour"` //有效期 小时
	}
}

/*
*
加载配置
*/
func LoadConfig(configPath string) (*AppConfig, error) {
	appConfig := &AppConfig{}
	file, err := os.Open(configPath)
	if err != nil {
		return nil, err
	}
	defer file.Close()
	d := yaml.NewDecoder(file)
	err = d.Decode(&appConfig)
	if err != nil {
		return nil, err
	}
	return appConfig, nil
}
